const Generator = require('yeoman-generator')

module.exports = class extends Generator {
    // Yeoman 在询问用户环节会自动调用此方法
    // 在此方法中可以调用父类的 prompt() 方法发出对用户的命令行询问
    prompting () {
        // 返回一个promise方法, 使得Yeoman在工作时有更好的工作流程控制
        // promt()接收一个数组参数，数组每项都是一个问题对象
        return this.prompt([
            {
                // 获取方式，用户输入
                type: 'input',
                // 获取结果的键
                name: 'name',
                // 给用户的提示即问题
                message: 'Your project name',
                // appname为项目生成目录名称默认值
                default: this.appname
            }
        ])
        .then(answers => {
            // answers 输出结果 => {name: 'user input value'}
            this.answers = answers
            // 使得writing中可以直接使用
        })
    }

    // Yeoman 自动在生成文件阶段调用此方法  
    // 方法内实现往项目目录写入模板目录文件
    writing () {
        // 批量生成目录
        // 把每一个文件都通过模板转换到目标路径
        // 使用数组循环  模板目录下的每一个文件的相对路径
        const templates = [
            '.browserslistrc',
            '.editorconfig',
            '.env.development',
            '.env.production',
            '.eslintrc.js',
            '.gitignore',
            'babel.config.js',
            'package.json',
            'postcss.config.js',
            'README.md',
            'public/favicon.ico',
            'public/index.html',
            'src/App.vue',
            'src/main.js',
            'src/router.js',
            'src/assets/logo.png',
            'src/components/HelloWorld.vue',
            'src/store/actions.js',
            'src/store/getters.js',
            'src/store/index.js',
            'src/store/mutations.js',
            'src/store/state.js',
            'src/utils/request.js',
            'src/views/About.vue',
            'src/views/Home.vue'
        ]

        templates.forEach(item => {
            // item => 每个文件路径
            // 通过模板方式写入文件到目标目录 将模板文件映射到输出目录
            this.fs.copyTpl(
                // 模板文件路径
                this.templatePath(item),
                // 输出目标路径
                this.destinationPath(item),
                // 模板数据上下文
                this.answers
            )
        })
    }
}